home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / lisp / wgdb-42.lha / wgdb-4.2 / README.configure < prev   
Text File  |  1992-09-11  |  26KB  |  574 lines

  1.            On Configuring Development Tools
  2.  
  3.             K. Richard Pixley
  4.             Cygnus Support
  5.  
  6.          Last Mod Tue Oct 1 21:20:21 PDT 1991, by rich@cygnus.com
  7.  
  8. INTRO
  9. -----
  10.  
  11.     This document attempts to describe the general concepts behind
  12.     configuration of the Cygnus Support release of the GNU Development
  13.     Tools.  It also discusses common usage.  Eventually, FIXME, there
  14.     will also be a man page for "configure", an "info" tree, etc.
  15.  
  16.  
  17. BASICS
  18. ------
  19.  
  20. Some Basic Terms:
  21.  
  22.     There are a lot of terms that are frequently used when discussing
  23.     development tools.  Most of the common terms have been used for
  24.     several different concepts such that their meanings have become
  25.     ambiguous to the point of being confusing.  Typically, we only
  26.     guess at their meanings from context and we frequently guess
  27.     wrong.
  28.  
  29.     This document uses very few terms by comparison.  The intent is to
  30.     make the concepts as clear as possible in order to convey the
  31.     usage and intent of these tools.
  32.  
  33.     "Programs" run on "machines".  Programs are very nearly always
  34.     written in "source".  Programs are "built" from source.
  35.     "Compilation" is a process that is frequently, but not always,
  36.     used when building programs.
  37.  
  38.  
  39. Host Environments:
  40.  
  41.     In this document, the word "host" refers to the environment in
  42.     which this source will be compiled.  "host" and "host name" have
  43.     nothing to do with the proper name of your host, like "ucbvax",
  44.     "prep.ai.mit.edu" or "att.com".  Instead they refer to things like
  45.     "sun4" and "dec3100".
  46.  
  47.     Forget for a moment that this particular directory of source is
  48.     the source for a development environment.  Instead, pretend that
  49.     it is the source for a simpler, more mundane, application, say, a
  50.     desk calculator.
  51.  
  52.     Source that can be compiled in more than one environment,
  53.     generally needs to be set up for each environment explicitly.
  54.     Here we refer to that process as configuration.  That is, we
  55.     configure the source for a host.
  56.  
  57.     For example, if we wanted to configure our mythical desk
  58.     calculator to compile on a SparcStation, we might configure for
  59.     host sun4.  With our configuration system:
  60.  
  61.     cd desk-calculator ; ./configure sun4
  62.  
  63.     does the trick.  "configure" is a shell script that sets up
  64.     Makefiles, subdirectories, and symbolic links appropriate for
  65.     compiling the source on a sun4.
  66.  
  67.     The "host" environment does not necessarily refer to the machine
  68.     on which the tools are built.  It is possible to provide a sun3
  69.     development environment on a sun4.  If we wanted to use a cross
  70.     compiler on the sun4 to build a program intended to be run on a
  71.     sun3, we would configure the source for sun3.
  72.  
  73.     cd desk-calculator ; ./configure sun3
  74.  
  75.     The fact that we are actually building the program on a sun4 makes
  76.     no difference if the sun3 cross compiler presents an environment
  77.     that looks like a sun3 from the point of view of the desk
  78.     calculator source code.  Specifically, the environment is a sun3
  79.     environment if the header files, predefined symbols, and libraries
  80.     appear as they do on a sun3.
  81.  
  82.     Nor does the host environment refer to the the machine on which
  83.     the program to be built will run.  It is possible to provide a
  84.     sun3 emulation environment on a sun4 such that programs built in a
  85.     sun3 development environment actually run on the sun4.
  86.  
  87.     Host environment simply refers to the environment in which the
  88.     program will be built from the source.
  89.  
  90.  
  91. Configuration Time Options:
  92.  
  93.     Many programs have compile time options.  That is, features of the
  94.     program that are either compiled into the program or not based on a
  95.     choice made by the person who builds the program.  We refer to these
  96.     as "configuration options".  For example, our desk calculator might be
  97.     capable of being compiled into a program that either uses infix
  98.     notation or postfix as a configuration option.  For a sun3, chosing
  99.     infix might be:
  100.  
  101.     ./configure sun3 +notation=infix
  102.  
  103.     while a sun4 with postfix might be:
  104.  
  105.     ./configure sun4 +notation=postfix
  106.  
  107.     If we wanted to build both at the same time, in the same directory
  108.     structure, the intermediate pieces used in the build process must
  109.     be kept separate.
  110.  
  111.     ./configure sun4 +subdirs +notation=postfix
  112.     ./configure sun3 +subdirs +notation=infix
  113.  
  114.     will create subdirectories for the intermediate pieces of the sun4
  115.     and sun3 configurations.  This is necessary as previous systems
  116.     were only capable of one configuration at a time.  A second
  117.     configuration overwrote the first.  We've chosen to retain this
  118.     behaviour so the "+subdirs" configuration option is necessary
  119.     to get the new behaviour.  The order of the arguments doesn't
  120.     matter.  There should be exactly one argument without a leading
  121.     '+' sign and that argument will be assumed to be the host name.
  122.  
  123.     From here on the examples will assume that you want to build the
  124.     tools "in place" and won't show the "+subdirs" option, but
  125.     remember that it is available.
  126.  
  127.     In order to actually install the program, the configuration system
  128.     needs to know where you would like the program installed.  The
  129.     default location is /usr/local.  We refer to this location as
  130.     $(destdir).  All user visible programs will be installed in
  131.     $(destdir)/bin.  All other programs and files will be installed in
  132.     a subdirectory of $(destdir)/lib.
  133.  
  134.     You can elect to change $(destdir) only as a configuration time
  135.     option.
  136.  
  137.     ./configure sun4 +notation=postfix +destdir=/local
  138.  
  139.     Will configure the source such that:
  140.  
  141.     make install
  142.  
  143.     will put it's programs in /local/bin and /local/lib/gcc.  If you
  144.     change $(destdir) after building the source, you will need to:
  145.  
  146.     make clean
  147.  
  148.     before the change will be propogated properly.  This is because
  149.     some tools need to know the locations of other tools.
  150.  
  151.     With these concepts in mind, we can drop the desk calculator and
  152.     move on to the application that resides in these directories,
  153.     namely, the source to a development environment.
  154.  
  155.  
  156. SPECIFICS
  157. ---------
  158.  
  159.     The GNU Development Tools can be built on a wide variety of hosts.
  160.     So, of course, they must be configured.  Like the last example,
  161.  
  162.     ./configure sun4 +destdir=/local
  163.     ./configure sun3 +destdir=/local
  164.  
  165.     will configure the source to be built in subdirectories, in order
  166.     to keep the intermediate pieces separate, and to be installed in
  167.     /local.
  168.  
  169.     When built with suitable development environments, these will be
  170.     native tools.  We'll explain the term "native" later.
  171.  
  172.  
  173. BUILDING DEVELOPMENT ENVIRONMENTS
  174. ---------------------------------
  175.  
  176.     The Cygnus Support GNU development tools can not only be built
  177.     with a number of host development environments, they can also be
  178.     configured to create a number of different development
  179.     environments on each of those hosts.  We refer to a specific
  180.     development environment created as a "target".  That is, the word
  181.     "target" refers to the development environment produced by
  182.     compiling this source and installing the resulting programs.
  183.  
  184.     For the Cygnus Support GNU development tools, the default target
  185.     is the same as the host.  That is, the development environment
  186.     produced is intended to be compatible with the environment used to
  187.     build the tools.
  188.  
  189.     In the example above, we created two configurations, one for sun4
  190.     and one for sun3.  The first configuration is expecting to be
  191.     built in a sun4 development environment, to create a sun4
  192.     development environment.  It doesn't necessarily need to be built
  193.     on a sun4 if a sun4 development environment is available
  194.     elsewhere.  Likewise, if the available sun4 development
  195.     environment produces executables intended for something other than
  196.     sun4, then the development environment built from this sun4
  197.     configuration will run on something other than a sun4.  From the
  198.     point of view of the configuration system and the GNU development
  199.     tools source, this doesn't matter.  What matters is that they will
  200.     be built in a sun4 environment.
  201.  
  202.     Similarly, the second configuration given above is expecting to be
  203.     built in a sun3 development environment, to create a sun3
  204.     development environment.
  205.  
  206.     The development environment produced, is a configuration time
  207.     option, just like $(destdir).
  208.  
  209.     ./configure sun4 +destdir=/local +target=sun3
  210.     ./configure sun3 +destdir=/local +target=sun4
  211.  
  212.     In this example, like before, we create two configurations.  The
  213.     first is intended to be built in a sun4 environment, in
  214.     subdirectories, to be installed in /local.  The second is intended
  215.     to be built in a sun3 environment, in subdirectories, to be
  216.     installed in /local.
  217.  
  218.     Unlike the previous example, the first configuration will produce
  219.     a sun3 development environment, perhaps even suitable for building
  220.     the second configuration.  Likewise, the second configuration will
  221.     produce a sun4 development environment, perhaps even suitable for
  222.     building the first configuration.
  223.  
  224.     The development environment used to build these configurations
  225.     will determine the machines on which the resulting development
  226.     environments can be used.
  227.  
  228.  
  229. A WALK THROUGH
  230. --------------
  231.  
  232. Native Development Environments:
  233.  
  234.     Let us assume for a moment that you have a sun4 and that with your
  235.     sun4 you received a development environment.  This development
  236.     environment is intended to be run on your sun4 to build programs
  237.     that can be run on your sun4.  You could, for instance, run this
  238.     development environment on your sun4 to build our example desk
  239.     calculator program.  You could then run the desk calculator
  240.     program on your sun4.
  241.  
  242.     The resulting desk calculator program is referred to as a "native"
  243.     program.  The development environment itself is composed of native
  244.     programs that, when run, build other native programs.  Any other
  245.     program is referred to as "foreign".  Programs intended for other
  246.     machines are foreign programs.
  247.  
  248.     This type of development environment, which is by far the most
  249.     common, is refered to as "native".  That is, a native development
  250.     environment runs on some machine to build programs for that same
  251.     machine.  The process of using a native development environment to
  252.     build native programs is called a "native" build.
  253.  
  254.     ./configure sun4
  255.  
  256.     Will configure this source such that when built in a sun4
  257.     development environment, with a development environment that
  258.     builds programs intended to be run on sun4 machines, the programs
  259.     built will be native programs and the resulting development
  260.     environment will be a native development environment.
  261.  
  262.     The development system that came with your sun4 is one such
  263.     environment.  Using it to build the GNU Development Tools is a
  264.     very common activity and the resulting development environment is
  265.     very popular.
  266.  
  267.     make all
  268.  
  269.     will build the tools as configured and will assume that you want
  270.     to use the native development environment that came with your
  271.     machine.
  272.  
  273.     Using a development environment to build a development environment
  274.     is called "bootstrapping".  The Cygnus Support release of the GNU
  275.     Development Tools is capable of bootstrapping itself.  This is a
  276.     very powerful feature that we'll return to later.  For now, let's
  277.     pretend that you used the native development environment that came
  278.     with your sun4 to bootstrap the Cygnus Support release and let's
  279.     call the new development environment stage1.
  280.  
  281.     Why bother?  Well, most people find that the Cygnus Support
  282.     release builds programs that run faster and take up less space
  283.     than the native development environments that came with their
  284.     machines.  Some people didn't get development environments with
  285.     their machines and some people just like using the GNU tools
  286.     better than using other tools.
  287.  
  288.     While you're at it, if the GNU tools produce better programs, maybe
  289.     you should use them to build the GNU tools.  It's a good idea, so
  290.     let's pretend that you do.  Let's call the new development
  291.     environment stage2.
  292.  
  293.     So far you've built a development environment, stage1, and you've
  294.     used stage1 to build a new, faster and smaller development
  295.     environment, stage2, but you haven't run any of the programs that
  296.     the GNU tools have built.  You really don't yet know if these
  297.     tools work.  Do you have any programs built with the GNU tools?
  298.     Yes, you do.  stage2.  What does that program do?  It builds
  299.     programs.  Ok, do you have any source handy to build into a
  300.     program?  Yes, you do.  The GNU tools themselves.  In fact, if you
  301.     use stage2 to build the GNU tools again the resulting programs
  302.     should be identical to stage2.  Let's pretend that you do and call
  303.     the new development environment stage3.
  304.  
  305.     You've just completed what's called a "three stage boot".  You now
  306.     have a small, fast, somewhat tested, development environment.
  307.  
  308.     make bootstrap
  309.  
  310.     will do a three stage boot across all tools and will compare
  311.     stage2 to stage3 and complain if they are not identical.
  312.  
  313.     Once built,
  314.  
  315.     make install
  316.  
  317.     will install the development environment in the default location
  318.     or in $(destdir) if you specified an alternate when you
  319.     configured.  In fact, you can skip the "make all" part and just
  320.     "make install" which will make sure that the development
  321.     environment is built before attempting to install anything.  Even
  322.     better, for configurations where host is the same as target, like
  323.     this one, "make install" will make sure that a "make bootstrap" is
  324.     done before installing anything.
  325.  
  326.     Any development environment that is not a native development
  327.     environment is refered to as a "cross" development environment.
  328.     There are many different types of cross development environments
  329.     but most fall into one of FIXME basic categories.
  330.  
  331.  
  332. Emulation Environments:
  333.  
  334.     The first category of cross development environment is called
  335.     "emulation".  There are two primary types of emulation, but both
  336.     types result in programs that run on the native host.
  337.  
  338.     The first type is "software emulation".  This form of cross
  339.     development environment involves a native program that when run on
  340.     the native host, is capable of interpreting, and in most aspects
  341.     running, a program intended for some other machine.  This
  342.     technique is typically used when the other machine is either too
  343.     expensive, too slow, too fast, or not available, perhaps because
  344.     it hasn't yet been built.  The native, interpreting program is
  345.     called a "software emulator".
  346.  
  347.     The GNU Development Tools do not currently include any software
  348.     emulators.  Some do exist and the GNU Development Tools can be
  349.     configured to create simple cross development environments for
  350.     with these emulators.  More on this later.
  351.  
  352.     The second type of emulation is when source intended for some
  353.     other development environment is built into a program intended for
  354.     the native host.  The concept of universes in operating systems
  355.     and hosted operating systems are two such development
  356.     environments.
  357.  
  358.     The Cygnus Support Release of the GNU Development Tools can be
  359.     configured for one such emulation at this time.
  360.  
  361.     ./configure sun4 +ansi
  362.  
  363.     will configure the source such that when built in a sun4
  364.     development environment the resulting development environment is
  365.     capable of building sun4 programs from strictly conforming ANSI
  366.     X3J11 C source.  Remember that the environment used to build the
  367.     tools determines the machine on which this tools will run, so the
  368.     resulting programs aren't necessarily intended to run on a sun4,
  369.     although they usually are.  Also note that the source for the GNU
  370.     tools is not strictly conforming ANSI source so this configuration
  371.     cannot be used to bootstrap the GNU tools.
  372.  
  373.  
  374. Simple Cross Environments:
  375.  
  376.     ./configure sun4 +target=a29k
  377.  
  378.     will configure the tools such that when compiled in a sun4
  379.     development environment the resulting development environment can
  380.     be used to create programs intended for an a29k.  Again, this does
  381.     not necessarily mean that the new development environment can be
  382.     run on a sun4.  That would depend on the development environment
  383.     used to build these tools.
  384.  
  385.     Earlier you saw how to configure the tools to build a native
  386.     development environment, that is, a development environment that
  387.     runs on your sun4 and builds programs for your sun4.  Let's
  388.     pretend that you use stage3 to build this simple cross
  389.     configuration and let's call the new development environment
  390.     gcc-a29k.  Remember that this is a native build.  Gcc-a29k is a
  391.     collection of native programs intended to run on your sun4.
  392.     That's what stage3 builds, programs for your sun4.  Gcc-a29k
  393.     represents an a29k development environment that builds programs
  394.     intended to run on an a29k.  But, remember, gcc-a29k runs on your
  395.     sun4.  Programs built with gcc-a29k will run on your sun4 only
  396.     with the help of an appropriate software emulator.
  397.  
  398.     Building gcc-a29k is also a bootstrap but of a slightly different
  399.     sort.  We call gcc-a29k a simple cross environment and using
  400.     gcc-a29k to build a program intended for a29k is called "crossing
  401.     to" a29k.  Simple cross environments are the second category of
  402.     cross development environments.
  403.  
  404.  
  405. Crossing Into Targets:
  406.  
  407.     ./configure a29k +target=a29k
  408.  
  409.     will configure the tools such that when compiled in an a29k
  410.     development environment, the resulting development environment can
  411.     be used to create programs intended for an a29k.  Again, this does
  412.     not necessarily mean that the new development environment can be
  413.     run on an a29k.  That would depend on the development environment
  414.     used to build these tools.
  415.  
  416.     If you've been following along this walk through, then you've
  417.     already built an a29k environment, namely gcc-a29k.  Let's pretend
  418.     you use gcc-a29k to build the current configuration.
  419.  
  420.     Gcc-a29k builds programs intended for the a29k so the new
  421.     development environment will be intended for use on an a29k.  That
  422.     is, this new gcc consists of programs that are foreign to your
  423.     sun4.  They cannot be run on your sun4.
  424.  
  425.     The process of building this configuration is another a bootstrap.
  426.     This bootstrap is also a cross to a29k.  Because this type of
  427.     build is both a bootstrap and a cross to a29k, it is sometimes
  428.     referred to as a "cross into" a29k.  This new development
  429.     environment isn't really a cross development environment at all.
  430.     It is intended to run on an a29k to produce programs for an a29k.
  431.     You'll remember that this makes it, by definition, an a29k native
  432.     compiler.  "Crossing into" has been introduced here not because it
  433.     is a type of cross development environment, but because it is
  434.     frequently confused one.  The process is "a cross" but the
  435.     resulting development environment is a native development
  436.     environment.
  437.  
  438.     You could not have built this configuration with stage3, because
  439.     stage3 doesn't provide an a29k environment.  Instead it provides a
  440.     sun4 environment.
  441.  
  442.     If you happen to have an a29k lying around, you could now use
  443.     this fresh development environment on the a29k to three-stage
  444.     these tools all over again.  This process would look just like it
  445.     did when we built the native sun4 development environment because
  446.     we would be building another native development environment, this
  447.     one on a29k.
  448.  
  449.     
  450. The Three Party Cross:
  451.  
  452.     So far you've seen that our development environment source must be
  453.     configured for a specific host and for a specific target.  You've
  454.     also seen that the resulting development environment depends on
  455.     the development environment used in the build process.
  456.  
  457.     When all four match identically, that is, the configured host, the
  458.     configured target, the environment presented by the development
  459.     environment used in the build, and the machine on which the
  460.     resulting development environment is intended to run, then the new
  461.     development environment will be a native development environment.
  462.  
  463.     When all four match except the configured host, then we can assume
  464.     that the development environment used in the build is some form of
  465.     library emulation.
  466.  
  467.     When all four match except for the configured target, then the
  468.     resulting development environment will be a simple cross
  469.     development environment.
  470.  
  471.     When all four match except for the host on which the development
  472.     environment used in the build runs, the build process is a "cross
  473.     into" and the resulting development environment will be native to
  474.     some other machine.
  475.  
  476.     Most of the other permutations do exist in some form, but only one
  477.     more is interesting to the current discussion.
  478.  
  479.     ./configure a29k +target=sun3
  480.  
  481.     will configure the tools such that when compiled in an a29k
  482.     development environment, the resulting development environment can
  483.     be used to create programs intended for a sun3.  Again, this does
  484.     not necessarily mean that the new development environment can be
  485.     run on an a29k.  That would depend on the development environment
  486.     used to build these tools.
  487.  
  488.     If you are still following along, then you have two a29k
  489.     development environments, the native development environment that
  490.     runs on a29k, and the simple cross that runs on your sun4.  If you
  491.     use the a29k native development environment on the a29k, you will
  492.     be doing the same thing we did a while back, namely building a
  493.     simple cross from a29k to sun3.  Let's pretend that instead, you
  494.     use gcc-a29k, the simple cross development environment that runs
  495.     on sun4 but produces programs for a29k.
  496.  
  497.     The resulting development environment will run on a29k because
  498.     that's what gcc-a29k builds, a29k programs.  This development
  499.     environment will produce programs for a sun3 because that is how
  500.     it was configured.  This means that the resulting development
  501.     environment is a simple cross.
  502.  
  503.     There really isn't a common name for this process because very few
  504.     development environments are capable of being configured this
  505.     extensively.  For the sake of discussion, let's call this process
  506.     a "three party cross".
  507.  
  508.  
  509. FINAL NOTES
  510. -----------
  511.  
  512. By "configures", I mean that links, Makefile, .gdbinit, and
  513. config.status are built.  Configuration is always done from the source
  514. directory.
  515.  
  516. * "./configure name" configures this directory, perhaps recursively,
  517.   for a single host+target pair where the host and target are both
  518.   "name".  If a previous configuration existed, it will be
  519.   overwritten.
  520.  
  521. * "./configure hostname +target=targetname" configures this directory,
  522.   perhaps recursively, for a single host+target pair where the host is
  523.   hostname and target is targetname.  If a previous configuration
  524.   existed, it will be overwritten.
  525.  
  526. * "./configure +subdirs hostname +target=targetname" creates a
  527.   subdirectories H-hostname and H-hostname/T-targetname and
  528.   configures H-hostname/T-targetname.  For now, makes should
  529.   be done from H-hostname/T-targetname.  "./configure +sub name"
  530.   works as expected.  That is, it creates H-name and
  531.   H-name/T-name and configures the latter.
  532.  
  533.  
  534. Hacking configurations:
  535.  
  536. The configure scripts essentially do three things, create
  537. subdirectories if appropriate, build a Makefile, and create links to
  538. files, all based on and tailored to, a specific host+target pair.  The
  539. scripts also create a .gdbinit if appropriate but this is not
  540. tailored.
  541.  
  542. The Makefile is created by prepending some variable definitions to a
  543. Makefile template called Makefile.in and then inserting host and
  544. target specific Makefile fragments.  The variables are set based on
  545. the chosen host+target pair and build style, that is, if you use
  546. subdirectories or not.  The host and target specific Makefile may or
  547. may not exist.  If fragments
  548.  
  549. * Makefiles can be edited directly, but those changes will eventually
  550.   be lost.  Changes intended to be permanent for a specific host
  551.   should be made to the host specific Makefile fragment.  This should
  552.   be in ./config/hmake-host if it exists.  Changes intended to be
  553.   permanent for a specific target should be made to the target
  554.   specific Makefile fragment.  This should be in ./config/tmake-target
  555.   if it exists.  Changes intended to be permanent for the directory
  556.   should be made in Makefile.in.  To propogate changes to any of
  557.   these, either use "make Makefile" or re-configure from the source
  558.   directory.
  559.  
  560. * configure can be edited directly, but those changes will eventually
  561.   be lost.  Changes intended to be permanent for a specific directory
  562.   should be made to configure.in.  Changes intended to be permanent
  563.   for all configure scripts should be made to configure.template.
  564.   Propogating changes to configure.in requires the presence of
  565.   configure.template which normally resides in the uppermost directory
  566.   you received.  To propogate changes to either configure.template or
  567.   a configure.in, use "configure +template=pathtothetemplate".
  568.   This will configure the configure scripts themselves, recursively if
  569.   appropriate.
  570.  
  571. * "./configure -srcdir=foo" is not supported yet.  At the moment, things
  572.   will probably be configured correctly only for leaf directories, and
  573.   even they will not have paths to libraries set properly.
  574.